{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  聚类分析 k-means k-中心点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 聚类算法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### k个聚类中心点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "两种初始取k个聚类中心点的方式\n",
    "+ 随机生成k个聚类中心点 ——K-means算法\n",
    "+ 随机选取k个聚类中心点（在已有数据点中选取）——K-中心点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K-means均值算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#随机生成k个聚类中心点\n",
    "def InitCentroids(dataset,k):\n",
    "    raw,column=dataset.shape#数据集的形状，raw行，column列\n",
    "    centroids=np.zeros((k,column))#k行，column列的用0填充的数组\n",
    "    #遍历每一列\n",
    "    for j in range(column):\n",
    "        #计算每列的最小值\n",
    "        minJ=min(dataset[:,j])#所有行的第j列元素\n",
    "        #计算每列的范围值\n",
    "        rangeJ=float(max(dataset[:,j])-min(dataset[:,j]))\n",
    "        centroids[:,j]=minJ+rangeJ*np.random.rand(k)\n",
    "        #np.random.rand(k)[1,0.562,....]k个数\n",
    "    return centroids"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 计算两点距离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def euclDistance(vector1, vector2):  \n",
    "    return np.sqrt(np.sum(np.power(vector2 - vector1, 2)))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 具体算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def Kmeans(dataset,k):\n",
    "    raw,column=dataset.shape#数据集的形状\n",
    "    clusterAssment=np.mat(np.zeros((raw,2)))#矩阵，raw行，两列\n",
    "    #第一列存放样本点应归属的点（聚类中心点）\n",
    "    #第二列存放样本点与聚类中心点的距离\n",
    "    clusterChanged=True #状态标识\n",
    "    centroids=InitCentroids(dataset,k)\n",
    "    while clusterChanged:#clusterChanged为True，即执行\n",
    "        clusterChanged=False\n",
    "        for i in range(raw):\n",
    "            mindistan=1000000.0#设置一个很大的最小距离\n",
    "            minIndex=0\n",
    "            #给每个样本点归入类\n",
    "            for r in range(k):\n",
    "                distance=euclDistance(centroids[r,:], dataset[i,:])\n",
    "                #该样本点与选取的每个聚类中心点的距离\n",
    "                if distance<mindistan:\n",
    "                    mindistan=distance\n",
    "                    minIndex=r\n",
    "            if clusterAssment[i,0]!=minIndex:\n",
    "                #归属更新,样本点归属到已有的聚类中心点上\n",
    "                clusterChanged=True#改为true,仍进行循环，进行归类\n",
    "                clusterAssment[i,:]=minIndex,mindistan**2\n",
    "#更新聚类中心点坐标\n",
    "        for r in range(k):\n",
    "            #以一个聚类中心点为中心点的所有点\n",
    "            pointsInCluster=dataset[np.nonzero(clusterAssment[:,0].A==r)[0]]\n",
    "            #clusterAssment[:,0]所有行的第一列，即各聚类中心点\n",
    "            #.A矩阵转换为数组\n",
    "            #np.nonzero返回数组中非零元素的索引值数组\n",
    "            #[0]取点的第一次出现\n",
    "            centroids[r, :]=np.mean(pointsInCluster,axis=0)\n",
    "            #每一列的均值\n",
    "    print('K-means聚类完成')\n",
    "    return centroids,clusterAssment\n",
    "    #返回的是中心点和分类结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K中心点聚类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### k个中心点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "#从已知数据点中随机选取k个聚类中心点\n",
    "def SeleCentroids(dataset,k):\n",
    "    raw,column=dataset.shape#数据集的形状，raw行，column列\n",
    "    centroids=np.zeros((k,column))#k行，column列的用0填充的数组\n",
    "    for i in range(k):\n",
    "        index=int(np.random.uniform(0,raw+1))#左闭右开\n",
    "        centroids[i,:]=dataset[index,:]\n",
    "    return centroids"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 计算代价TC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#dataset数据集\n",
    "#medoids_idx 候选中心点\n",
    "#clusterAssment 聚类结果\n",
    "#medoids 字典，中心点为键，本次归属到各中心点的样本点为值\n",
    "def totalcost(dataset,medoids_idx):\n",
    "    distances_cache={}\n",
    "    size=len(dataset)\n",
    "    total_cost=0.0\n",
    "    medoids={}\n",
    "    for idx in medoids_idx:\n",
    "        medoids[idx]=[]\n",
    "    for i in range(size):\n",
    "        choice=None\n",
    "        min_cost=100000.0\n",
    "        for m in medoids:#m默认为键，中心点\n",
    "            #计算各样本数据点到medoids_idx的距离，\n",
    "            #将其归属到距离最近的那个中心点\n",
    "            tmp=distances_cache.get((m,i),None)\n",
    "            if tmp==None:\n",
    "                tmp=euclDistance(dataset[m],dataset[i])\n",
    "                distances_cache[(m,i)]=tmp#存每个点到中心点的距离\n",
    "            if tmp<min_cost:\n",
    "                choice=m\n",
    "                min_cost=tmp\n",
    "        #更新分类\n",
    "        medoids[choice].append(i)\n",
    "        total_cost+=min_cost\n",
    "    return total_cost,medoids"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 计算两点距离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def euclDistance(vector1, vector2):  \n",
    "    return np.sqrt(np.sum(np.power(vector2 - vector1, 2)))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 具体算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "\n",
    "def kmedoids1(dataset,k):\n",
    "    raw,column=dataset.shape\n",
    "    centroids=np.zeros((k,column))\n",
    "    clusterAssment=np.mat(np.zeros((raw,2)))\n",
    "    medoids_idx=random.sample([i for i in range (raw)],k)\n",
    "    #k个点的序列号\n",
    "    pre_cost,medoids=totalcost(dataset,medoids_idx)\n",
    "    current_cost=100000\n",
    "    best_choice=[]\n",
    "    best_res={}\n",
    "    iter_count=0\n",
    "    while 1:\n",
    "        for m in medoids:\n",
    "            #每一簇 medoids为字典，键为中心点，值为类内的样本点\n",
    "            for item in medoids[m]:\n",
    "                if item!=m:#非中心点的样本点\n",
    "                    idx=medoids_idx.index(m)#中心点的序号\n",
    "                    swap_temp=medoids_idx[idx]#中心点\n",
    "                    medoids_idx[idx]=item#更新中心点\n",
    "                    tmp,medoids_=totalcost(dataset,medoids_idx)\n",
    "                    if tmp <current_cost:\n",
    "                        best_choice=list(medoids_idx)#最好的中心点\n",
    "                        best_res=dict(medoids_)#最好的聚类\n",
    "                        current_cost=tmp\n",
    "                    medoids_idx[idx]=swap_temp\n",
    "        iter_count+=1\n",
    "        if best_choice==medoids_idx:\n",
    "            break\n",
    "        if current_cost<=pre_cost:\n",
    "            pre_cost=current_cost\n",
    "            medoids=best_res\n",
    "            medoids_idx=best_choice\n",
    "    centNum=0\n",
    "    for index in best_choice:\n",
    "        centroids[centNum,:]=dataset[index,:]#中心点\n",
    "        centNum+=1\n",
    "    classNumber=0\n",
    "    for key in best_res:#key,中心点每个中心点\n",
    "        for index in best_res[key]:#index,每类包含的样本点\n",
    "            clusterAssment[index,0]=classNumber\n",
    "        classNumber+=1\n",
    "    print('K-中心点完成')\n",
    "    return centroids,clusterAssment\n",
    "                    \n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数据头5行：\n",
      "(200, 5)\n",
      "   ID      性别  年龄  年收入(万元)  消费评分(1-100)\n",
      "0   1    Male  19       15           39\n",
      "1   2    Male  21       15           81\n",
      "2   3  Female  20       16            6\n",
      "3   4  Female  23       16           77\n",
      "4   5  Female  31       17           40\n"
     ]
    }
   ],
   "source": [
    "X_origin = pd.read_csv('ch12_Mall_Customers.csv',encoding='gb2312')\n",
    "print('原始数据头5行：')\n",
    "print(X_origin.shape)\n",
    "print(X_origin.head())\n",
    "\n",
    "X = X_origin.drop(['ID','性别'],axis=1)#去除不必要的属性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 规格化转换数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "规格化转换后数据：\n",
      "       atr1      atr2      atr3\n",
      "0 -1.424569 -1.738999 -0.434801\n",
      "1 -1.281035 -1.738999  1.195704\n",
      "2 -1.352802 -1.700830 -1.715913\n",
      "3 -1.137502 -1.700830  1.040418\n",
      "4 -0.563369 -1.662660 -0.395980\n"
     ]
    }
   ],
   "source": [
    "from sklearn import preprocessing\n",
    "X_scaled = preprocessing.scale(X)\n",
    "#给属性重命名\n",
    "X_scaled_frame = pd.DataFrame(X_scaled,columns=['atr1','atr2','atr3'])\n",
    "print('规格化转换后数据：')\n",
    "print(X_scaled_frame.head())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据可视化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三维图展示数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "绘制3维图：\n"
     ]
    },
    {
     "data": {
      "image/png": "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havX8qaVxx+CI5E4//T7A7QOhhECzltVyLfesmHKKZmpMNWeORwOWw8s8zNN5GQyODjIW9/6Vr7whS9w9dVXz/haTkJkCD0VzD5o0y/K5XJx7bXXsmfPHsrKymZNQrPNsKCggOrq6vRe9CygqqolZAkGg9jtdjZu3Dip26ZuCPb878tEx63QP3/3NlYUH1+hb7u3jscbvJi3iKJI3HrRCv5h9/S712DmCbDkEl8sFrOSarm5uYyMjPDWt76V2267jeuvv35G13ESI0PomcCUht59993ce++9yLLMNddcw/XXX09lZeW0ya2qqiUYOZmE/kIImpqarCmMphNqqlZJEwc6R/jkffXohkA3BB88bzlv31k55jXX/ngvnUNR5FH7Jc0wuHJDKf95w/TFE3PNZptJtd7eXj7wgQ9gGAY33ngjn//859M22vckQIbQs4UQgu7ubovcsViMa665hj179kyqNjP1zytXrpz1MPP5gLnNUBSFNWvWWNdvWvp4vV78fj/5o/5jyeWwQFSjczhCcbaDkuwT9+IfvaOW51qGLNsoRZb45/OW809vmp4BQjpLU8FgkBtvvJHzzjuPYDBIV1cXd91115zOeRIhQ+h0QAhBf38/99xzD/fccw9+v5+rrrqKPXv2jNkbB4NBamtrWb9+/aLY1kwEwzA4fPgwHo+HmpqaCR9G4/uGp1sO6w/EeM+v9jESjWMIWFeWzU/fvWXKwfSQXjKHw2He/va38973vpf3vve9czrXZLjlllt48MEHKS0t5dChQ/P2PimQIfR8YGBggPvuu4977rmH/v5+rrzySiorK6mvr+czn/nMote7k2EYBgcPHrR07NNFqnKYKdlMRbxoXKexL4hNlllXno0iT33vpZPMkUiEm266ibe97W380z/905zONRWeeeYZsrOzec973pMh9OkGn8/HV77yFX73u99RU1PDBRdcwPXXXz/vPd3Tga7rHDhwgJKSkhnZK42H6ZPd19dHQ0c/w3GFTctLWbe8YtaqsnSSORaL8e53v5urr76aD3/4wwtSTWhtbeWaa645ZQl9end7zwFOp5OOjg4aGxtRFIWHHnqI7373uzQ3N3PxxRdz/fXXs2PHjgUnt2mLvGTJkjkn5kyf7AfqR/jhqzqKpBN/vY33bOjmjIqZDwZMJ5lVVeV973sfl1566YKR+XRAZoWeIcLhMA8//DB33XUXdXV11sq9e/fueZ8lrKoq+/fvn9CUfzboGo7w9p+9BoA8OhBPluD+f95B2D9kzek2BwNO5ByaTjLH43FuueUWdu/ezSc+8YkFJXNmhX6DwePxcOONN3LjjTcSjUb529/+xq9+9StuvfVWzj333Bn3dE8XsViM/fv3s3LlyrRa0PaMxFAU6XitWZYAQUCD5aNjcE2TgyNHjqQcDJhOMmuaxoc+9CG2bt264GQ+HZAh9Bzgcrm47rrruO6661BVlSeeeII777yTj3/845x11lns2bNn0p7u6cIsmU02YWO2WF7oxjAEuhDYZJm4buCyy5TlHN9D2+12KioqqKiosMphHR0dBAIBXC4XkUiEnTt3zvlz6rrORz7yEVauXMnnPve5DJlngUzIPQ+Ix+NWT/dzzz3Hzp072bNnz5ie7ukiFApZJbP5ajx5stHLFx5sBMAmy3znrRumNRnENEnMz8/H7/efMBhwJjAMg4997GMUFBTwzW9+c1ESjzfddBNPP/00AwMDlJWV8aUvfYkPfOADC/HWmSz3qQJd13nuuee46667ePrpp9m8eTN79uzhkksumTLZZNa/Z2tJPBOEVI3BYJyyXMes6szJgwEHBwfJysqyymFTbT8Mw+D//b//h8Ph4Hvf+96iVxEWARlCn4owDIOXXnqJu+66i8cff5w1a9Zwww03cNlll53QhGC6n6TLMiidmGrPnDxra2BgYNJOKrPPXVVVfvSjH70RyQxvBELfeeedfPGLX6S+vp6XX36ZXbt2LdalzAsMw+D111/nzjvv5K9//SvV1dXs2bOHK6+8kn379mEYBmedddaC+2JPhdkkwMxOKq/XiyRJlgQ1OzubL37xiwwNDfHTn/503qsEJzFOf0LX19cjyzIf/OAH+c53vnPaEToZhmFQW1vLnXfeyZ///Gei0Si33norN91000nlmZaObLbp+X377bfz2GOPkZOTw+9///vZumWeLkgboU/a+Gb9+vWsXbt2sS9jQSDLMlu3buWyyy6juLiYP/7xj4TDYW644QZuuOEG/u///g+v17uo15iu0pTL5aKqqoqKigq2bdvGv/3bv/HpT3+al156KY1X+8bFSbtCm7jwwgtP+xXaRDAYJB6PW6uy2dN91113cf/99+N2u60y2Vx6umeKdNaZhRD84Ac/4JVXXuFPf/rTvM7RevTRR7n11lvRdZ1//Md/5JOf/OS8vdcccXqE3Jdccgm9vb0n/P3XvvY19uzZA7yxCD0ZhBC0trZy9913c9999yHLMtdeey3XX389S5YsmTdyp5vMP/nJT3j66ae566675rWfWdd11qxZw2OPPUZVVRVnnHEGf/zjH0/W0P70UIo9/vjji/n2pxQkSWLFihV8/OMf5z/+4z/o6uri7rvv5p/+6Z9QVdVyY1m+fHnayJ1uMv/yl7/k8ccf55577pl3c4KXX36ZVatWUVNTA8A73/lO/vKXv5yshE4bTto9dAYTQ5IkqqqquPXWW3nqqae45557yMvL46Mf/SgXXXQR3/72t2lubmaK6GtSpJPMAL/97W+5//77ufvuu2c9GXQm6OrqGtOJVlVVRVdX17y/72LjpCX0vffeS1VVFS+++CJXX301l19++WJf0kkJSZIoLy/nwx/+MI8//jgPPfQQS5Ys4ZOf/CQXXHAB3/jGN6irq5sRudNN5j/96U/8+c9/5r777luwMlyqz/tGkJKe9EmxDGYPn89nrYqdnZ3WnO5NmzZNKOBIN5nvvvtufv7zn/Pggw/Ou9otGS+++CJf/OIX+etf/wrAN77xDQA+9alPLdg1zACnR1LsZMAplAmdE/x+Pw8++CB33303R44csXq6t2/fbpE73WS+//77+eEPf8iDDz644NZNmqaxZs0annjiCSorKznjjDP4wx/+MK8TKeeADKHTgVMsE5o2BINBHnnkEaun+6KLLqK4uJiBgQG+8pWvpIXMjzzyCN/5znd46KGH5nXgwWR4+OGH+djHPoau69xyyy185jOfWZTrmAYyhE4HTrGwbF4QiUT42te+xi9+8QvKyso4++yz2bNnz5x6uh9//HG++tWv8vDDD6e1d/s0xumvFFsIvFEzoclQFIWmpibq6urYu3cv1157LXfccQdnn302H/3oR3nyySeJx+PTPt8zzzzDl7/8ZR544IEMmRcBb2iDgzdqJjQZDoeDO+64w/rzVVddxVVXXUU8Hufpp5/m7rvv5rbbbmPXrl1cf/31XHjhhRP2dD///PN8+tOf5sEHH0ybRVIGM8MbmtBVVVV0dHRYf+7s7DypJmIsJux2O5deeimXXnopmqZZPd2f+9zn2LJlC9dffz0XX3yxVYbau3cvn/jEJ7j//vsz3+Ei4g29hz7FMqEnBXRdt3q6n3jiCdauXcvWrVv585//zAMPPHBSzPs6BZG+sFAIMdk/pz0eeughsXr1alFTUyO++tWvLvblnFLQdV28/PLL4tJLLxUvvvjigr3vHXfcITZs2CAkSRKvvPLKgr3vPGIqHk77nzf0Cp3BqYnTsFf+9GjOyCCD2WD9+vWLfQknLd7QZavFwC233EJpaSmbNm1a7EvJ4DREhtALjPe97308+uiji30ZJz0uueQSNm3adMI/f/nLXxb70k5qZELuBcb5559Pa2vrYl/GSY9Mr/zskFmhM8jgNEKG0Bmccsj0yk+MTNlqEbBIEw4zOHmRac7IIIMMTkSG0AuMm266ibPPPpvGxkaqqqr4xS9+sdiXlMFphEzInUEGi49MyJ1BBhmciAyh3wDo6OjgoosuYv369WzcuJHvf//7i31JGcwTpgq5MzgNIElSBVAhhHhdkqQc4DXgeiFE3SJfWgZpRmaFfgNACNEjhHh99L8DQD1QubhXlcF8IEPoNxgkSaoGtgN7F/lSMpgHZAj9BoIkSdnA3cDHhBD+xb6eDNKPDKHfIJAkyU6CzL8XQtyz2NeTwfwgkxR7A0BKWJn+GhgSQnxskS8ng3lEhtBvAEiSdC7wLFALGKN//WkhxMOLd1UZzAcyhM4gg9MImT10BhmcRsgQOoMMTiNkCJ1BBqcRMoTOIIPTCBlCZ5DBaYQMoTPI4DRChtAZZHAa4f8HszsjBd18fuIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "\n",
    "print('绘制3维图：')\n",
    "#创建一个三维的绘图工程\n",
    "fig_3d=plt.figure()\n",
    "ax3d=fig_3d.add_subplot(111,projection='3d') \n",
    "ax3d.scatter(X_scaled_frame['atr1'],X_scaled_frame['atr2'],X_scaled_frame['atr3']) \n",
    "fig_3d.savefig('3D数据图.png', dpi=300, bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据降维&二维展示"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "+ 三维数据降维二维"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      pca_1     pca_2\n",
      "0 -0.615720 -1.763481\n",
      "1 -1.665793 -1.820747\n",
      "2  0.337862 -1.674799\n",
      "3 -1.456573 -1.772430\n",
      "4 -0.038465 -1.662740\n",
      "绘制2维图：\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:14: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#数据降为2维\n",
    "#在sklearn中提供了PCA函数，可以将高维数据降为低维\n",
    "from sklearn.decomposition import PCA\n",
    "pca = PCA(n_components = 2)\n",
    "X_pca = pca.fit_transform(X_scaled)#转换过程\n",
    "X_pca_frame = pd.DataFrame(X_pca,columns=['pca_1','pca_2'])\n",
    "print(X_pca_frame.head())\n",
    "print('绘制2维图：')\n",
    "fig_2d=plt.figure()\n",
    "#创建一个二维的绘图工程\n",
    "ax2d=fig_2d.add_subplot(111) \n",
    "ax2d.plot(X_pca_frame['pca_1'],X_pca_frame['pca_2'],'bo') \n",
    "fig_2d.savefig('2D数据图（3D转换后）.png', dpi=300, bbox_inches='tight')\n",
    "fig_2d.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二维展示聚类结果函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "#dataset数据集\n",
    "#k，聚k类\n",
    "#centroids 聚类中心点坐标\n",
    "#clusterAssment 聚类结果\n",
    "def showcluster(dataset,k,centroids,clusterAssment):\n",
    "    fig_2d_cluster=plt.figure()#创建画面\n",
    "    ax2d_clustered=fig_2d_cluster.add_subplot(111)\n",
    "    #一行一列，只要一个子图\n",
    "    '''\n",
    "    绘制网格图，而三个参数的含义如下：\n",
    "    1.第一个参数和第二个参数表示网格的个数\n",
    "    2.第三个参数表示第几个子图\n",
    "    '''\n",
    "    raw,column=dataset.shape\n",
    "    if column !=2:#每个样本只有两个属性\n",
    "        print(\"只能绘制2维图形\")\n",
    "        return 1\n",
    "    #创建数据点标记格式控制列表，实现数据点区别输出\n",
    "    mark = ['.r', '+b', '*g', '1k', '^r', 'vr', 'sr', 'dr', '<r', 'pr'] \n",
    "    if k>len(mark):\n",
    "        print('分类过多，图无法显示')\n",
    "        return 1\n",
    "    #绘制所有样本点\n",
    "    for i in range(raw):\n",
    "        markIndex=int(clusterAssment[i,0])#选标志，按聚类点标志样本点\n",
    "        ax2d_clustered.plot(dataset[i,0],dataset[i,1],mark[markIndex])\n",
    "      \n",
    "    #绘制聚类中心点\n",
    "    for i in range(k):\n",
    "        ax2d_clustered.plot(centroids[i,0],centroids[i,1],mark[i])\n",
    "    fig_2d_cluster.savefig('cluster_2d.png',dpi=300, bbox_inches='tight')\n",
    "    fig_2d_cluster.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## k-means实例化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means均值聚类：\n",
      "K-means聚类完成\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:32: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "k=4\n",
    "print(\"K-means均值聚类：\")\n",
    "case_cen, case_clusterAssment = Kmeans(X_pca, k)\n",
    "#case_cen,中心点 case_clusterAssment，分类结果\n",
    "showcluster(X_pca, k, case_cen, case_clusterAssment)\n",
    "#X_pca，数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K-中心点实例化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K中心点聚类：\n",
      "K-中心点完成\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:32: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "k=4\n",
    "print(\"K中心点聚类：\")\n",
    "case_cen, case_clusterAssment = kmedoids1(X_pca, k)\n",
    "showcluster(X_pca, k, case_cen, case_clusterAssment) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 将聚类结果写回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "聚类结果：\n",
      "    ID      性别  年龄  年收入(万元)  消费评分(1-100)  聚类结果\n",
      "0    1    Male  19       15           39   1.0\n",
      "1    2    Male  21       15           81   1.0\n",
      "2    3  Female  20       16            6   2.0\n",
      "3    4  Female  23       16           77   1.0\n",
      "4    5  Female  31       17           40   1.0\n",
      "5    6  Female  22       17           76   1.0\n",
      "6    7  Female  35       18            6   2.0\n",
      "7    8  Female  23       18           94   1.0\n",
      "8    9    Male  64       19            3   2.0\n",
      "9   10  Female  30       19           72   1.0\n",
      "10  11    Male  67       19           14   2.0\n",
      "11  12  Female  35       19           99   1.0\n",
      "12  13  Female  58       20           15   2.0\n",
      "13  14  Female  24       20           77   1.0\n",
      "14  15    Male  37       20           13   2.0\n",
      "聚类结果按年龄统计均值\n",
      "聚类结果\n",
      "0.0    41.685714\n",
      "1.0    25.605263\n",
      "2.0    52.144928\n",
      "3.0    30.000000\n",
      "Name: 年龄, dtype: float64\n",
      "聚类结果按年收入统计均值\n",
      "聚类结果\n",
      "0.0    88.228571\n",
      "1.0    32.631579\n",
      "2.0    46.333333\n",
      "3.0    79.086207\n",
      "Name: 年收入(万元), dtype: float64\n",
      "聚类结果按消费评分统计均值\n",
      "聚类结果\n",
      "0.0    17.285714\n",
      "1.0    67.500000\n",
      "2.0    40.072464\n",
      "3.0    70.775862\n",
      "Name: 消费评分(1-100), dtype: float64\n"
     ]
    }
   ],
   "source": [
    "#将case_clusterAssment中的聚类结果写回原始DataFrame\n",
    "X_origin['聚类结果']=case_clusterAssment[:,0]\n",
    "print('聚类结果：')\n",
    "print(X_origin.head(15))\n",
    "#查看按照聚类结果分组的各属性均值\n",
    "print('聚类结果按年龄统计均值')\n",
    "g_Age=X_origin['年龄'].groupby(X_origin['聚类结果'])\n",
    "print(g_Age.mean())\n",
    "print('聚类结果按年收入统计均值')\n",
    "g_Income=X_origin['年收入(万元)'].groupby(X_origin['聚类结果'])\n",
    "print(g_Income.mean())\n",
    "print('聚类结果按消费评分统计均值')\n",
    "g_Rate=X_origin['消费评分(1-100)'].groupby(X_origin['聚类结果'])\n",
    "print(g_Rate.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
